package com.ecommerce.order.repository;

import com.ecommerce.order.entity.Order;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 订单Repository
 */
@Repository
public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {

    /**
     * 根据订单编号查询订单
     * @param orderNo 订单编号
     * @return 订单
     */
    Optional<Order> findByOrderNo(String orderNo);

    /**
     * 根据用户ID分页查询订单
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 订单分页
     */
    Page<Order> findByUserId(Long userId, Pageable pageable);

    /**
     * 根据用户ID和订单状态查询订单
     * @param userId 用户ID
     * @param status 订单状态
     * @return 订单列表
     */
    List<Order> findByUserIdAndStatus(Long userId, Integer status);

    /**
     * 根据用户ID和订单状态分页查询订单
     * @param userId 用户ID
     * @param status 订单状态
     * @param pageable 分页参数
     * @return 订单分页
     */
    Page<Order> findByUserIdAndStatus(Long userId, Integer status, Pageable pageable);

    /**
     * 根据订单状态查询订单数量
     * @param userId 用户ID
     * @param status 订单状态
     * @return 订单数量
     */
    long countByUserIdAndStatus(Long userId, Integer status);

    /**
     * 根据订单状态查询订单数量
     * @param status 订单状态
     * @return 订单数量
     */
    long countByStatus(Integer status);

    /**
     * 根据订单状态分页查询订单
     * @param status 订单状态
     * @param pageable 分页参数
     * @return 订单分页
     */
    Page<Order> findByStatus(Integer status, Pageable pageable);

    /**
     * 根据创建时间范围查询订单数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单数量
     */
    long countByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询指定状态的订单总金额
     * @param status 订单状态
     * @return 总金额
     */
    @Query("SELECT COALESCE(SUM(o.totalAmount), 0) FROM Order o WHERE o.status = :status")
    BigDecimal sumTotalAmountByStatus(@Param("status") Integer status);

    /**
     * 查询指定状态和创建时间范围的订单总金额
     * @param status 订单状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 总金额
     */
    @Query("SELECT COALESCE(SUM(o.totalAmount), 0) FROM Order o WHERE o.status = :status AND o.createdAt BETWEEN :startTime AND :endTime")
    BigDecimal sumTotalAmountByStatusAndCreatedAtBetween(@Param("status") Integer status, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 查询用户所有订单状态统计
     * @param userId 用户ID
     * @return 订单状态统计
     */
    @Query("SELECT new com.ecommerce.order.repository.OrderRepository$OrderStatusCount(o.status, COUNT(o)) FROM Order o WHERE o.userId = :userId GROUP BY o.status")
    List<OrderStatusCount> countByGroupByStatus(@Param("userId") Long userId);

    /**
     * 订单状态统计DTO
     */
    interface OrderStatusCount {
        Integer getStatus();
        Long getCount();
    }
}